// Go通过继承无法实现多态，只能通过实现接口方法来实现多态
// Go中某个类型需要实现接口中的所有方法才算作实现了接口。
package main

import (
	"fmt"
)

type Animal3 interface {
	Name() string
	Speak() string
	Play()
}

type Dog3 struct {
	name   string
	gender string
}

func (d *Dog3) Play() {
	fmt.Println(d.Speak())
}

func (d *Dog3) Speak() string {
	return fmt.Sprintf("my name is %v and my gender is %v", d.name, d.gender)
}

func (d *Dog3) Name() string {
	return d.name
}

func Play(a Animal3) {
	a.Play()
}

func main() {
	d := &Dog3{"Hachiko", "male"}
	fmt.Println(d.Name())
	fmt.Println(d.Speak())
	Play(d)
}
